package cn.hesion.Proxy.Cglib;
/**
 * ClassName: CglibDemo <br/>
 * Description: <br/>
 * date: 2021/12/25 14:39<br/>
 *
 * @author Hesion<br />
 * @version
 * @since JDK 1.8
 */

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Cglib的Demo
 * @author: hesion
 * @create: 2021-12-25 14:39
 **/
public class CglibDemo {
    public void test(){
        System.out.println("hello,cglib");
    }

    public static void main(final String[] args) {
        //创建对象
        UserService target = new UserService();
        //创建cglib的增强类对象
        Enhancer enhancer = new Enhancer();
        //这里可以设置缓存与否，到时候分析源码的时间，会讲到这个
        enhancer.setUseCache(false);
        //设置需要代理的类的字节码
        enhancer.setSuperclass(UserService.class);
        //设置callback的方法，在这里进行方法的增加，也就是代理的使用
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //如果是test方法就调用
                if(method.getName().equals("test")){
                    //可以当成扩展的功能
                    System.out.println("before method run...");
                    //调用test方法
                    method.invoke(target, objects);
                    //可以当成扩展的功能
                    System.out.println("after method run...");
                    return null;
                }
                return method.invoke(target, objects);
            }
        });

        UserService userService = (UserService) enhancer.create();
        userService.test();
    }
}
